iT邦幫忙

2024 iThome 鐵人賽

DAY 13
1
Python

時空序列分析-關鍵籌碼分析系列 第 13

含金量滿滿的文章? Step(1/4):關鍵分點籌碼爬蟲,之前拿到的券商地點,要怎麼處理?

  • 分享至 

  • xImage
  •  

各位日安,還記得在這篇文章的時候
決定欄位! 天下沒有白吃的午餐,股價、籌碼資料的其他來源?

透過 FinMind 拿到了證券商資訊表,裡面內含著券商分點的地址

(註: 檔案格式是.csv,因為excel預設是.xlsx,開起來會像是亂碼一般的生僻字和字元)
https://ithelp.ithome.com.tw/upload/images/20240813/20168322Ih9fPW9vPA.png

如果懶得寫程式,用excel開要用csv的讀檔方式
https://ithelp.ithome.com.tw/upload/images/20240813/20168322ahQjw65QhZ.png

資料表下載下來的資料欄位(如下圖)
https://ithelp.ithome.com.tw/upload/images/20240813/201683227J62cmbh8j.png

這個資料表裡面的欄位和資料將會成為這次爬蟲的關鍵!

我先保留前四個欄位券商代碼券商名稱開業日地址 備用,把資料另存成.xlsx方便開啟。
總共有847筆資料。

券商代碼 券商名稱 開業日 地址
1020 合庫 2011/12/2 台北市大安區忠孝東路四段285號1樓(部分)、經紀部複委託科地址:台北市松山區長安東路二段225號5樓
1021 合庫- 台中 2011/12/2 台中市西區民權路91號6樓
1022 合庫-台南 2011/12/2 台南市北區成功路48號3樓

如果逐一觀察每筆資料,會發現有的券商地點不只一個位置,甚至還有部分這種。
例如:

2210 群益期貨 2015/9/1 台北市大安區敦化南路2段97號32樓及地下1樓
5050 大展 1988/8/11 台北市承德路1段17號17樓、17樓之1、之2、之3
5058 大展-台南 2019/7/16 台南市西門路三段159號3樓
5110 富隆 1988/8/29 台北市南京東路3段287號3樓部份
5260 美好 1988/9/6 台北市民生東路2段174、176號3樓部份、4樓、174號12樓

這時如果要讓這份資料要能夠畫成證券商分點地圖,就需要再對資料進行一些前處理

第一,先來清除"號"後面的字,只保留前面的地址

先把檔案讀進來

import pandas as pd

# 讀取Excel檔案,路徑改成你資料夾和檔案所在的地方
df = pd.read_excel('E:/時空資料分析/關鍵分點籌碼分析_實測/files_ss/證券商地址_修.xlsx')
df

接著透過split 把字切開,針對地址這個欄位,再另存起來

# 定義一個函數來截斷'號'字後的文字
def truncate_after_char(address):
    return address.split('號')[0] + '號' if '號' in address else address

# 對'地址'欄位的每個項目應用這個函數
df['地址'] = df['地址'].apply(truncate_after_char)

# 將修改後的資料表保存到新的Excel檔案,檔案會儲存到你程式檔案的當前資料夾
df.to_excel("modified_file.xlsx", index=False)

一般我們如果在地圖上看一個人的家或是居住地址的時候,
如果把樓層也一併輸入google map查詢,有樓層的地址在地圖上呈現的位置和沒有樓層的地址一樣!

例如下圖,即使是公寓或是租屋處,地圖也只能呈現2D平面圖,所以樓層在地圖上並不是那麼地重要。
此外,如果有兩個地點以上,google map查不出來那個地址(錯亂)。
https://ithelp.ithome.com.tw/upload/images/20240813/20168322awNc9VSFTb.png
這時如果再用滑鼠對那個位置按右鍵,就可以看見那個位置的經緯度(前面是緯度(lat),後面是經度(lng))

但是,有800多筆資料,要這樣一筆一筆輸入查詢,點右鍵,再把拿到的經緯度自己填進去資料表,
如果不是有很多時間,好像不太現實,也不太有效率。

所以,參考了其他人是如何把地址轉成經緯度的,

這時要用到 google map API 來批次查詢地址的經緯度

(也有其他的方法可以做到)

二、 首先,申請 google map API (有免費額度可使用)

接著,按照這篇文章的教學,會拿到你的API金鑰(API key),記得複製後保存起來。

三、 測試拿到的 google map API key

這時用參考github上的這個專案的方式,嘗試看看。

在進行以下之前,要先 pip install 必要的套件庫,安裝後要重新把kernel啟動才會成功套用

pip install -U selenium
!pip install python-dotenv
pip install pipenv 
!pip install geocoder
pip install googlemaps 

接著引入需要用到的套件庫

import requests
import urllib #結果這個好像是多參考的,原作者只是拿來測試用,我沒用到哈哈
import json
import time
import pandas as pd 

定義一個函式,利用google查詢地址時上面的網址去做操作

def get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY):
    # decode url
    # address = urllib.quote(address)
    url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + address + '&key=' + GOOGLE_PLACES_API_KEY
    
    while True:
        res = requests.get(url)
        js = json.loads(res.text)

        if js['status'] != 'OVER_QUERY_LIMIT':
            time.sleep(1)
            break

    result = js['results'][0]['geometry']['location']
    lat = result['lat'] # 緯度
    lng = result['lng'] # 經度

    return address, lat, lng

接著嘗試看看查詢單一個地址,看看 API key 有沒有正常運作

#單一地址
address = '台北縣板橋市南雅南路二段一七0號'
GOOGLE_PLACES_API_KEY = 'AAsUfyAQ9PXgy3JjU2Nvy_3AvECs8Gj-fM-W6po' # 把 API KEY 寫在' '裡面
get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY)
#lat, lng = get_latitude_longtitude()

('台北縣板橋市南雅南路二段一七0號', 24.9988421, 121.4526873)

四、利用API key對剛才的modified_file.xlsx批次進行查詢的動作

既然單次可以正常運作,就可以開始把剛才處理過的excel檔讀進來批次操作。
沿用上面的程式碼,寫在一起:

# 匯入資料,有中文的時候要注意編碼用 utf-8 或 big5
import pandas as pd
import requests
import json
import time

def get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY):
    url = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + address + '&key=' + GOOGLE_PLACES_API_KEY
    
    while True:
        res = requests.get(url)
        js = json.loads(res.text)

        if js['status'] != 'OVER_QUERY_LIMIT':
            time.sleep(1)
            break

    result = js['results'][0]['geometry']['location']
    lat = result['lat']
    lng = result['lng']

    return address, lat, lng

# 讀取剛才存的 Excel 檔案
data = pd.read_excel('E:/時空資料分析/關鍵分點籌碼分析_實測/files_ss/modified_file.xlsx')

# 建立新的資料框架,包含原始資料和新增的經緯度欄位
df_empty = pd.DataFrame(columns=['券商代碼', '券商名稱', '開業日', '地址', '緯度', '經度'])

# Google Places API Key
GOOGLE_PLACES_API_KEY = 'AAsUfyAQ9PXgy3JjU2Nvy_3AvECs8Gj-fM-W6po'

# 用for迴圈跑原始資料框架的每一行
for index, row in data.iterrows():
    address = row['地址']
    result = get_latitude_longtitude(address, GOOGLE_PLACES_API_KEY)

    print(result)
    
      # 將查詢結果加入新的資料框架
    df_empty.loc[len(df_empty)] = [row['券商代碼'], row['券商名稱'], row['開業日'], result[0], result[1], result[2]]
    
    # 避免 API 請求過於頻繁
    time.sleep(1)

# 將新的資料框架輸出成新的 Excel 檔案
df_empty.to_excel('PLUS_lat_lng_address.xlsx', index=False)

('台北市大安區忠孝東路四段285號', 25.0416821, 121.5542213)
('台中市西區民權路91號', 24.1380648, 120.6795332)
('台南市北區成功路48號', 22.9981399, 120.2077419)
('高雄市大勇路97號', 22.6247854, 120.28419)
('嘉義市國華街279號', 23.4805488, 120.4483104)
('基隆市仁二路255號', 25.1297521, 121.7424337)
('彰化縣彰化市民生路279號', 24.0819936, 120.5423098)
('高雄市鳳山區鳳松路3號', 22.6321339, 120.3607556)
('新竹市東區東門街60號', 24.8044371, 120.972732)
('台北市中山區南京東路2段85、87號', 25.0523761, 121.5318859)
('桃園市桃園區中華路12號', 24.9912755, 121.311581)
('台中市西屯區漢口路二段151號', 24.1652868, 120.6617334)
('新北市三重區正義南路17號', 25.0613709, 121.497948)
('台北市松山區長安東路二段225號', 25.0487974, 121.5454745)
...

這個過程會跑有點久,因為有用time sleep,大概跑了半小時左右,

今天先到這邊,明天繼續!
謝謝各位的收看。

參考文章&資料來源:
1.Google Maps API 學習筆記-1:地圖、標記、客製樣式
2.Python_Latitude-and-Longitude-github
3.google map API設定教學-Webduino 學習手冊


每日記錄:
加權指數:收在21796.57點,上漲23.31點,開始要進入穩定的盤整期了嗎(?
大家都在等聯準會的降息,不知道這期間會不會突然來個黑天鵝。

這幾天發生好多事,台灣的奧運好手們回國了,昨天還有一起成大的死亡車禍,癲癇還開車真的很可怕...


上一篇
爬蟲很好玩,獲取籌碼資訊有解? 動態網頁的爬蟲方式!
下一篇
含金量滿滿的文章? Step(2/4): 關鍵分點籌碼爬蟲,券商分點地圖視覺化
系列文
時空序列分析-關鍵籌碼分析31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言